package MPGenerator;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * MyBatis-Plus代码生成器
 *
 * @author TheTsing
 */
public class MpGeneratorUtil {

    /**
     * MySQL相关配置
     */
    private static final String host = "thetsing.mysql.cn-chengdu.rds.aliyuncs.com";

    private static final String port = "3306";

    private static final String database = "spring_boot_cli";

    private static final String username = "springbootcli";

    private static final String password = "MySQL12345aA#";

    /**
     * 模块名
     */
    private static final String modelName = "spring-boot-cli-common";

    /**
     * 包名
     */
    private static final String packageName = "com.tsing.cli.common";

    public static void main(String[] args) {
        FastAutoGenerator.create(
                        "jdbc:mysql://" + host + ":" + port + "/" + database + "?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"
                        , username
                        , password)
                // 全局配置
                .globalConfig(builder -> {
                    builder
                            //.fileOverride() // 覆盖已生成文件
                            .disableOpenDir() // 禁止打开输出目录
                            .author("TheTsing") // 作者名
                            .commentDate("yyyy-MM-dd HH:mm") // 指定注释日期格式化
                            //.enableSwagger() // 开启 swagger 模式
                            .dateType(DateType.ONLY_DATE) // 时间策略
                            .outputDir(System.getProperty("user.dir") + "/" + modelName + "/src/main/java"); // 指定输出目录
                })
                //包配置
                .packageConfig(builder -> {
                    builder.parent(packageName) // 父包名
                            .entity("entity") // Entity 包名
                            .service("service") // Service 包名
                            .serviceImpl("service.impl") // Service Impl 包名
                            .mapper("mapper") // Mapper 包名
                            .xml("mapper.xml") // Mapper XML 包名
                            .controller("controller"); // Controller 包名
                })
                //模板配置
                .templateEngine(new FreemarkerTemplateEngine())
                // 策略配置
                .strategyConfig(builder -> builder
                        .likeTable(new LikeTable("sys_")) // 模糊表匹配
                        //.addInclude("t_simple") // 增加表匹配
                        .addTablePrefix("sys_", "t_") // 增加过滤表前缀
                        // Entity 策略配置
                        .entityBuilder()
                        .enableChainModel() // 开启链式模型
                        .enableLombok() // 开启 lombok 模型
                        .logicDeleteColumnName("is_deleted") // 逻辑删除数据库字段名称
                        .enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀
                        .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                        .idType(IdType.ASSIGN_ID) // 全局主键类型
                        .formatFileName("%sEntity") // 格式化文件名称
                        .controllerBuilder()
                        .enableRestStyle())
                .execute();
    }

}
